【学习笔记】[集训队互测 2021] 数列重排
其实这种纯贪心的题目是可以做出来的。
考虑怎么计算。
首先,区间等价于都在区间中出现过。只考虑$
现在考虑插入的数。你发现不是很好算,但是可以转化成计算插入一个数对答案的增量。具体的,每次可以看成是在长度为且为的子区间前面插入一个数,设这个数前面已经插入了个数,插入前序列总长度为,那么答案为:
然后令增加。
现在我们考虑在两端插入数的情况。此时答案为:
因此,排除掉前面那部分固定的贡献,初始将两端的,其余的置为,我们可以将问题抽象成:每次选择一个数,令答案加上,然后减少。
暴力计算即可。复杂度。
对于这种纯贪心的题目,**大胆猜结论**。大多数情况下这样做都是对的,细节留到最后考虑。 其实还有几道纯贪心的题目: [CF887F Row of Models](https://www.luogu.com.cn/problem/CF887F) [CF1806F2 GCD Master (hard version)](https://www.luogu.com.cn/problem/CF1806F2) [CF1891E Brukhovich and Exams](https://codeforces.com/contest/1891/problem/E)(第一次ak div2) 反正我的感觉是结论**基本**都猜得到,但是有些细节考虑不到。比如GCD Master那道题就没有想到对于相同的数怎么处理。1 | #include<bits/stdc++.h> |
【学习笔记】[集训队互测 2021] 数列重排